package pe.gob.reniec.dni_ws;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.XPath;
import org.dom4j.xpath.DefaultXPath;
import org.springframework.ws.server.endpoint.AbstractDom4jPayloadEndpoint;

public class DatosDniDom4jEndpoint extends AbstractDom4jPayloadEndpoint {
	
	private static final String namespaceUri = "http://www.w3.org/2001/XMLSchema";
	private XPath nroDniPath;
	private DatosDniService datosDniService;
	private DateFormat dateFormat;
	
	public DatosDniDom4jEndpoint() {
        Map<String, String> namespaceUris = new HashMap<String, String>();
        namespaceUris.put("datosDni", namespaceUri);        
        nroDniPath = new DefaultXPath("/datosDni:GetDatosDniRequest/datosDni:nroDni");
        nroDniPath.setNamespaceURIs(namespaceUris);
        
        dateFormat = new SimpleDateFormat("yyyy-MM-dd");
	}
	
	public void setDatosDniService(DatosDniService datosDniService) {
        this.datosDniService = datosDniService;
    }	
	
	@Override
	protected Element invokeInternal(Element requestElement, Document responseDocument)
			throws Exception {		
		
        String nroDni = nroDniPath.valueOf(requestElement);
		DatosDniInfo datosDni = datosDniService.getDatosDni(nroDni); 
        Element responseElement = responseDocument.addElement("GetDatosDniResponse", namespaceUri);        
        
        Element datosDniElement = responseElement.addElement("DatosDniInfo");        
        datosDniElement.addElement("apellidoPaterno").setText(datosDni.getApellidoPaterno());
        datosDniElement.addElement("apellidoMaterno").setText(datosDni.getApellidoMaterno());
        datosDniElement.addElement("nombres").setText(datosDni.getNombres());        
        datosDniElement.addElement("fechaNacimiento").setText(dateFormat.format(datosDni.getFechaNacimiento()));   
        datosDniElement.addElement("estadoCivil").setText(datosDni.getEstadoCivil());  
        return responseElement;
	}
}
